package ca.qc.bdeb.jeuxdesboites;

import ca.qc.bdeb.jeuxdesboites.commun.EvenementPartie;
import ca.qc.bdeb.jeuxdesboites.commun.IDJoueurs;
import ca.qc.bdeb.jeuxdesboites.model.GestionPartie;
import ca.qc.bdeb.mvc.Observateur;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

/**
 *
 * @author Eric Wenaas <eric.wenaas@bdeb.qc.ca>
 * @version 0.3
 */
final class FenetrePrincipale extends JFrame implements Observateur {

    private HorlogeGUI horlogeOrdinateur;
    private HorlogeGUI horlogeHumain;
    private GestionPartie leJeu;
    private JeuxGUI vueJeu;
    private JButton boutonNouvellePartie;
    private JLabel labelOrdinateur;
    private JLabel labelJoueur;
    private JLabel labelPointsOrdinateur;
    private JLabel labelPointsHumain;
    
    
    FenetrePrincipale() {
        initComposants();
        ajouterEcouteurs();
        setLayout(null);
    }
    
    private void initComposants() {
        initHorlogeOrdinateur();
        initLabelOrdinateur();
        initPointsOrdinateur();
        initHorlogeHumain();
        initBoutonNouvellePartie();
        initLabelJoueur();
        initPointsJoueur();
        initVueTableau();
    }
    
    private void initHorlogeOrdinateur() {
        horlogeOrdinateur = new HorlogeGUI();
        horlogeOrdinateur.setBackground(GlobalesGUI.COULEUR_HORLOGE_ORDINATEUR);
        horlogeOrdinateur.setSize(200, 70);
        horlogeOrdinateur.setLocation(750, 100);
        add(horlogeOrdinateur);
    }

    private void initLabelOrdinateur() {
        labelOrdinateur = new JLabel("Ordinateur: ");
        labelOrdinateur.setFont(GlobalesGUI.POLICE_POINT);
        labelOrdinateur.setSize(150, 50);
        labelOrdinateur.setLocation(750, 40);
        add(labelOrdinateur);
    }
        
    private void initPointsOrdinateur() {
        labelPointsOrdinateur = new JLabel("0");
        labelPointsOrdinateur.setFont(GlobalesGUI.POLICE_POINT);
        labelPointsOrdinateur.setSize(50, 50);
        labelPointsOrdinateur.setLocation(900, 40);
        labelPointsOrdinateur.setHorizontalAlignment(JLabel.RIGHT);
        add(labelPointsOrdinateur);
    }

    private void initBoutonNouvellePartie() {
        boutonNouvellePartie = new JButton();
        boutonNouvellePartie.setText("Nouvelle partie");
        boutonNouvellePartie.setSize(200, 25);
        boutonNouvellePartie.setLocation(750, 200);
        add(boutonNouvellePartie);
    }

    private void initHorlogeHumain() {
        horlogeHumain = new HorlogeGUI();
        horlogeHumain.setBackground(GlobalesGUI.COULEUR_HORLOGE_HUMAIN);
        horlogeHumain.setSize(200, 70);
        horlogeHumain.setLocation(750, 568);
        add(horlogeHumain);   
    }
    
    private void initLabelJoueur() {
        labelJoueur = new JLabel("Vous: ");
        labelJoueur.setFont(GlobalesGUI.POLICE_POINT);
        labelJoueur.setSize(100, 50);
        labelJoueur.setLocation(750, 508);
        add(labelJoueur);
        
    }
    
    private void initPointsJoueur() {
        labelPointsHumain = new JLabel("0");
        labelPointsHumain.setFont(GlobalesGUI.POLICE_POINT);
        labelPointsHumain.setSize(50, 50);
        labelPointsHumain.setLocation(900, 508);
        labelPointsHumain.setHorizontalAlignment(JLabel.RIGHT);
        add(labelPointsHumain);        
    }
            
    private void initVueTableau() {
        vueJeu = new JeuxGUI();
        vueJeu.setSize(680, 680);
        vueJeu.setLocation(30, 30);
        vueJeu.setVisible(true);
        add(vueJeu);
    }
    
    private void ajouterEcouteurs() {
        boutonNouvellePartie.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                demarrerPartie();
            }
        });
    }
        
    private void demarrerPartie() {
        leJeu = new GestionPartie (5, 5);
        leJeu.initialiserPartie("Vous", 180000, true);
        leJeu.demarrerPartie();
        vueJeu.setJeu(leJeu);
        leJeu.ajouterObservateur(this);
        mettreAJourHorloge();
        vueJeu.changementEtat();
        mettreAJourPoints();
    }
    
    void mettreAJourHorloge() {
        long tempsOrdinateur = leJeu.getTemps(IDJoueurs.JOUEUR_ARTIFICIEL);
        long tempsHumain = leJeu.getTemps(IDJoueurs.JOUEUR_HUMAIN);
        horlogeHumain.afficherTempsRestant(tempsHumain);
        horlogeOrdinateur.afficherTempsRestant(tempsOrdinateur);
    }

    void mettreAJourPoints() {
        int pointsJoueur = leJeu.compterPoints(IDJoueurs.JOUEUR_HUMAIN);
        int pointsOrdinateur = leJeu.compterPoints(IDJoueurs.JOUEUR_ARTIFICIEL);
        labelPointsHumain.setText(Integer.toString(pointsJoueur));
        labelPointsOrdinateur.setText(Integer.toString(pointsOrdinateur));
    }
    
    // Méthodes de l'interface Observateur
    
    @Override
    public void changementEtat() {
        mettreAJourHorloge();
        vueJeu.changementEtat();
        mettreAJourPoints();
    }

    @Override
    public void changementEtat(Enum<?> property, Object o) {
        EvenementPartie event = (EvenementPartie) property;
        GestionnaireEvenement gestionnaire = 
                GestionnaireEvenementFactory.obtenirGestionnaire(event, o);
        gestionnaire.apply(this);
        gestionnaire.apply(vueJeu);
    }
}
